#include <ESP8266WiFi.h>       // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>  //  ESP8266WebServer库

ESP8266WebServer esp8266_server(80);  // 建立ESP8266WebServer对象，对象名称为esp8266_server

int IN1 = D1;
int IN2 = D2;
int IN3 = D5;
int IN4 = D6;
int ENA = D7;  //使能1
int ENB = D8;  //使能2

void setup(void) {
  Serial.begin(115200);  // 启动串口通讯
  WiFi.mode(WIFI_AP);

  // 初始化引脚=================================================
  // 初始化 PWM 输出，频率为 1kHz
  analogWriteFreq(1000);

  pinMode(IN1, OUTPUT);  // IN1
  pinMode(IN2, OUTPUT);  // IN2
  pinMode(IN3, OUTPUT);  // IN3
  pinMode(IN4, OUTPUT);  // IN4
  pinMode(ENA, OUTPUT);  // 使能A
  pinMode(ENB, OUTPUT);  // 使能B
  // 初始化引脚=====================================================

  const char *ssid = "trolley";  // 这里定义将要建立的WiFi名称。此处以"taichi-maker"为示例
                                 // 您可以将自己想要建立的WiFi名称填写入此处的双引号中

  const char *password = "12345678";  // 这里定义将要建立的WiFi密码。此处以12345678为示例
                                      // 您可以将自己想要使用的WiFi密码放入引号内
                                      // 如果建立的WiFi不要密码，则在双引号内不要填入任何信息

  WiFi.softAP(ssid, password);  // 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。
                                // 括号中有两个参数，ssid是WiFi名。password是WiFi密码。
                                // 这两个参数具体内容在setup函数之前的位置进行定义。

  Serial.print("Access Point: ");   // 通过串口监视器输出信息
  Serial.println(ssid);             // 告知用户NodeMCU所建立的WiFi名
  Serial.print("IP address: ");     // 以及NodeMCU的IP地址
  Serial.println(WiFi.softAPIP());  // 通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址

  //--------"启动网络服务功能"程序部分开始-------- //  此部分为程序为本示例程序重点1
  esp8266_server.begin();              //  详细讲解请参见太极创客网站《零基础入门学用物联网》
  esp8266_server.on("/", handleRoot);  //  第3章-第2节 ESP8266-NodeMCU网络服务器-1
  esp8266_server.onNotFound(handleNotFound);
  //--------"启动网络服务功能"程序部分结束--------
  Serial.println("HTTP esp8266_server started");  //  告知用户ESP8266网络服务功能已经启动
}

void loop(void) {
  esp8266_server.handleClient();  // 处理http服务器访问
}

void handleRoot() {  //处理网站根目录“/”的访问请求
  // 获取用户请求网址信息
  int speed = esp8266_server.arg("speed").toInt();
  Serial.println(speed);
  if (speed >= 0 && speed <= 1023) {
    analogWrite(ENA, speed);  // 调整 PWM 占空比实现调速
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    // digitalWrite(IN3, HIGH);
    // digitalWrite(IN4, LOW);
  }
  esp8266_server.send(200, "text/plain", "Success");  // NodeMCU将调用此函数。
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound() {                                      // 当浏览器请求的网络资源无法在服务器找到时，
  esp8266_server.send(404, "text/plain", "404: Not found");  // NodeMCU将调用此函数。
}